package com.itheima.aspect;

import com.alibaba.fastjson.JSON;
import com.itheima.pojo.BrandLog;
import com.itheima.service.BrandLogService;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.Date;

/**
 * @Author itheima
 * @Date 2022/4/9 20:08
 */
@Component  //把Bean交给Spring管理，创建对象
@Aspect //表示切面类，spring会调用通知方法
@Slf4j  //日志打印
public class LogAspect {
    @Autowired
    private BrandLogService brandLogService;

    //定通知：标注@Around("")注解的方法叫做通知方法，方法内定义通知逻辑
    //定切点：@Around("")注解内的表达式叫做切点表达式，用来确定哪些目标方法要增强
    @Around("execution(* com.itheima.service.impl.BrandServiceImpl.add*(..)) || execution(* com.itheima.service.impl.BrandServiceImpl.update*(..)) || execution(* com.itheima.service.impl.BrandServiceImpl.delete*(..))")
    public Object around(ProceedingJoinPoint pjp) throws Throwable {
        //书写增强的逻辑
        //1 获取执行目标方法的耗时
        long start = System.nanoTime();
        Object result = pjp.proceed();//执行目标方法
        long end = System.nanoTime();
        //计算耗时
        long timeConsuming=end-start;
        //2 获取其他参数
        //2.1 获取方法名
        String methodName = pjp.getSignature().getName();
        //2.2 获取方法参数，转换成json
        Object[] args = pjp.getArgs();
        String parameter = JSON.toJSONString(args);
        //2.3 获取操作方法的时间
        Date operatorTime=new Date();
        //3 封装成BrandLog对象，调用service添加到表中
        BrandLog brandLog=new BrandLog(null,methodName,parameter,timeConsuming,operatorTime);
        //4 调用service添加到表中
        brandLogService.addBrandLog(brandLog);
        return result;
    }
}
